package com.dusk.util
{
	public final class ArrayUtil extends UtilBase
	{
		
		/**
		 * 筛选掉数组中的空元素
		 * @param tarArr 目标数组
		 * @return 筛选后数组
		 */
		public static function filterNoValue(tarArr:Array):Array
		{
			var arr:Array = [];
			for each(var item:* in tarArr)
			{
				if(item)
				{
					arr.push(item)
				}
			}
			return arr;
		}
		
		/**
		 * 筛选元素中重复元素
		 * @param tarArr 目标数组
		 * @return 筛选后数组
		 */
		public static function filterKeepOne(tarArr:Array):Array
		{
			var _tmp:Array = [];
			function filterFunction(i:*,...rest):Boolean
			{
				if(_tmp.indexOf(i) == -1)
				{
					_tmp.push(i);
					return true;
				}
				return false;
			}
			return tarArr.filter(filterFunction);
		}
		
		/**
		 * 剔除数组1中包含在数组2中的元素
		 * @param arr1 操作数组
		 * @param arr2 参考数组
		 * @return 过滤后数组
		 */
		public static function filterOneFromOther(arr1:Array,arr2:Array):Array
		{
			var arr:Array = [];
			for each (var item:* in arr1)
			{
				if(item != null && arr2.indexOf(item) == -1)
				{
					arr.push(item);
				}
			}
			return arr;
		}
		
		/**
		 * 数组比较，元素相同返回真
		 * @param arr1 目标数组1
		 * @param arr2 目标数组2
		 * @return 是否相同
		 */
		public static function compare(arr1:Array, arr2:Array):Boolean
		{
			if(arr1.length != arr2.length)
			{
				return false;
			}
			for each(var item:* in arr1)
			{
				var idx:int = arr2.indexOf(item);
				if(idx != -1)
				{
					arr2.splice(idx,1)
				}
				else
				{
					return false
				}
			}
			return arr2.length == 0;
		}
		
		/**
		 * 数组是否包含元素
		 */
		public static function contains(arr:Object, item:Object):Boolean
		{
			return arr.indexOf(item) != -1;
		}
		
		/**
		 * 复制数组
		 * @param array 数组
		 * @return 数组
		 */
		public static function copyArray(array:Array):Array
		{
			return array.slice();
		}
		
		/**
		 * 获取所有目标元素的索引
		 * @param search 搜索目标
		 * @param tarArr 搜索域
		 * @return 索引值集合
		 */
		public static function findAll(search:*,tarArr:Array):Array
		{
			var idxArr:Array = [];
			var i:int = tarArr.indexOf(search);
			while (i != -1)
			{
				idxArr.push(i);
				i++;
				i = tarArr.indexOf(search, i);
			}
			return idxArr;
		}
		
		/**
		 * 删除数组中指定元素
		 * @param arr 数组
		 * @param item 项目
		 * @param removeRepeat 是否删除重复元素
		 */
		public static function removeElement(arr:Array, item:Object,removeRepeat:Boolean = true):void
		{
			do
			{
				var idx:int = arr.indexOf(item);
				if (idx == -1)
				{
					break;
				}
				arr.splice(idx, 1);
			}
			while (removeRepeat)
		}
		
		/**
		 * 清空数组
		 * @param arr 数组
		 */
		public static function removeAllElement(arr:Array):void
		{
			while(arr.length > 0)
			{
				arr.pop();
			}
		}
		
		/**
		 * 从target中移除在needRemove中存在的元素
		 * @param needRemove 指定需要移除的元素
		 * @param target 目标数组
		 */
		public static function removeElementFromAnother(needRemove:Array, target:Array):void
		{
			while (needRemove.length > 0)
			{
				var item:* = needRemove.pop();
				ArrayUtil.removeElement(target,item);
			}
		}
	}
}
